//基于JavaScript对象的Stack类
class Stack
{
    constructor()
    {
        //使用一个count属性来帮助我们记录栈的大小
        this.count = 0;
        //创建对象
        this.items ={};
    }
    
    push(element)
    {
        /*
        在JavaScript中，对象是一系列键值对的集合。要向栈中添加元素，
        我们将使用count变量作为items对象的键名，
        插入的元素则是它的值。在向栈插入元素后，我们递增count变量。
        */
        this.items[this.count] = element;
        this.count++;
    }

    isEmpty()
    {
        return this.count===0;
    }

    pop()
    {
        if(this.isEmpty())
        {
            return undefined;
        }
        this.count--;
        const result = this.items[this.count];
        //在 JavaScript 中，delete 操作符用于删除对象中的某个属性
        delete this.items[this.count];
        return result;
    }

    peek()
    {
        if(this.isEmpty)
        {
            return undefined;
        }
        return this.isEmpty[this.count--];
    }

    clear()
    {
        this.items ={};
        this.count = 0;
    }

    /*
    在数组版本中，我们不需要关心toString方法的实现，
    因为数据结构可以直接使用数组已经提供的toString方法。
    对于使用对象的版本，我们将创建一个toString方法来像数组一样打印出栈的内容
    */
    toString() 
    {
        if (this.isEmpty()) {
          return '';
        }
        //初始化字符串 objString，将其设置为栈的第一个元素（索引为 0）。
        //这里使用模板字符串将元素转换为字符串形式。
        let objString = `${this.items[0]}`; 
        
        for (let i = 1; i < this.count; i++)
        { 
          //每次迭代都将当前元素附加到 objString 字符串后面，并在元素之间加上逗号和空格。
          objString = `${objString}, ${this.items[i]}`; 
        }
        return objString;
    }
}

let stack = new Stack();
stack.push(129);
stack.push(386);
stack.push(101);

/*
for(let ele in stack.items)
{
    console.log(ele.key + ": " + ele.value);
}*/


for (let ele in stack.items) {
    if (stack.items.hasOwnProperty(ele)) {
        console.log(`${ele}: ${stack.items[ele]}`);
    }
}

console.log(stack.toString());


